#include <iostream>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>
using namespace std;

// int main()
// {
//     pid_t id = fork();
//     if (id == 0)
//     {
//         cout << "I am child" << endl;
//         int a = 10;
//         int b = 0;
//         a /= b;
//         exit(-1);
//     }
//     int status = 0;
//     pid_t rid = waitpid(id, &status, 0);
//     if (rid > 0)
//     {
//         cout << "wait succcess" << endl;
//         cout << "err code:" << ((status >> 8) & 0xFF) << " quit signal:" << (status & 0x7F) << " core dump:" << ((status >> 7) & 1) << endl;
//     }
//     else
//     {
//         cout << "wait false!" << endl;
//     }
//     return 0;
// }

#include <iostream>
#include <unistd.h>
#include <cstdio>
#include <sys/types.h>
#include <sys/wait.h>

// void PrintPending(sigset_t &pending)
// {
//     std::cout << "curr process[" << getpid() << "]pending: ";
//     for (int signo = 31; signo >= 1; signo--)
//     {
//         if (sigismember(&pending, signo))
//         {
//             std::cout << 1;
//         }
//         else
//         {
//             std::cout << 0;
//         }
//     }
//     std::cout << "\n";
// }

// int main()
// {
//     // 屏蔽2号信号
//     sigset_t block_set, old_set;
//     sigemptyset(&block_set);
//     sigemptyset(&old_set);
//     sigaddset(&block_set, SIGINT); 
//     // 设置进入进程的Block表中
//     sigprocmask(SIG_BLOCK, &block_set, &old_set); 

//     int cnt = 15;
//     while (true)
//     {
//         // 2. 获取当前进程的pending信号集
//         sigset_t pending;
//         sigpending(&pending);

//         // 3. 打印pending信号集
//         PrintPending(pending);
//         sleep(1);
//     }
// }

void Print(sigset_t &pending)
{
    for(int sig = 31; sig > 0; sig--)
    {
        if(sigismember(&pending, sig))
        {
            std::cout << 1;
        }
        else
        {
            std::cout << 0;
        }
    }
    std::cout << std::endl;
}

void handler(int signum)
{
    std::cout << "get a sig: " << signum << std::endl;
    int cnt=7;
    while(cnt)
    {
        cnt--;
        sigset_t pending;
        sigpending(&pending);

        Print(pending);
        sleep(1);
    }
    exit(1);
}

int main()
{
    // struct sigaction act, oact;
    // act.sa_handler = handler;
    // sigemptyset(&act.sa_mask); 
    // act.sa_flags = 0;

    // sigaction(2, &act, &oact); //捕捉2号信号
    signal(2,handler);

    while(true)
    {
        std::cout << "I am a process, pid: " << getpid() << std::endl;
        sleep(1);
    }
    return 0;
}